package com.example.jimanguang.Repositories.untils;


import com.example.jimanguang.web.models.VmUser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

@Component//配置为组件，便可以读取配置文件app.over.minuters:25
public class AuthUtils {
    public static final List<VmUser> USERS=new ArrayList<>();//final不能重新赋值了，但可以添加删除
    private static int minutes;
    @Value("${app.over.minutes:25")//读取配置文件的会话超时
    public static void setMinutes(int minutes){
        AuthUtils.minutes=minutes;
    }
//    stream()实现了从集合中筛选、排序和结果收集等功能，比传统方式代码简洁、易读、易维护，同时也具有更好的扩展性和高性能。
//使用filter()函数挑选出符合条件的元素，再使用findAny()函数返回任意一个符合条件的元素，最后使用orElse()如果存在符合条件的元素则返回该元素本身；否则返回null。
    public static String logout(String token){
        VmUser vmUser=USERS.stream().filter(u-> u.getToken().equals(token)).findAny().orElse(null);
        if(vmUser==null){
            return "注销失败，没有找到该用户登录记录";
        }
        USERS.remove(vmUser);
        return "注销成功";
    }


    public static boolean  illegalUser(String token, int[] allowRoles){//int[] allowRoles代表状态数组
        /*判断用户什么身份*/
      VmUser user= USERS.stream().filter(u->u.getToken().equals(token))
              .findAny()
              .orElse(null);
      if(user==null||isOverTime(user)){
          return false;
      }
      //如果不是可以更新一下登录时间
        user.setLastLogin(new Date());
        return Arrays.stream(allowRoles).noneMatch(r->r==user.getType());//noMactch是否匹配，返回值boolean

    }

   //判断用户是否超时
    private static boolean isOverTime(VmUser user){
        long offmillis=System.currentTimeMillis()-user.getLastLogin().getTime();
        long minutes=offmillis/(1000*60);
        boolean over=minutes>AuthUtils.minutes;
        if(over){
           USERS.remove(user);
        }
        return over;
    }

//   验证执行操作是否本人，防止用户id泄露造成的风险
    //@param userid通过接口传递来的操作者
    //@param token 通过接口传递来的实际用户id
    //@return 是否同一个用户
   public static boolean isOneSelf(UUID userid, String token){
       VmUser user= USERS.stream()
               .filter(u->u.getToken().equals(token))
               .findAny()
               .orElse(null);
       if(user==null||isOverTime(user)){
           return false;
       }
    boolean oneself=user.getId().equals(userid);
       if(oneself){
           //如果是本人更新时间
           user.setLastLogin(new Date());
       }
       return oneself;
   }

   //12.29日
   //
   public static VmUser getUser(String token){

        return USERS.stream()
                .filter(user->user.getToken().equals(token))
                .findAny()
                .orElse(null);

   }





}
